// Store的user.js模块需要自己搭建
// 导入token 方法
import { getToken, setToken, removeToken, setTimeStamp } from '@/utils/auth'
import { login, getUserInfo, getUserDetailById } from '@/api/user'

const state = {
  token: getToken(), // 设置token为共享状态，初始化vuex的时候先从缓存中读取token
  // 定义一个空对象 而不是 null
  // 因为我们会在 getters中引用userinfo的变量,
  // 如果设置为null，则会引起异常和报错
  userInfo: {}
}
const mutations = {
  // 设置token
  setToken(state, token) {
    state.token = token // 将传过来的载荷token设置给vuex
    // 同步给缓存
    setToken(token)
  },
  // 删除token
  removeToken(state) {
    state.token = null // 清除vuex中的token
    removeToken() // 清除缓存中的token
  },
  // 存储用户个人资料
  setUserInfo(state, userinfo) {
    state.userInfo = userinfo // 这样是给对象重新赋值改变了userinfo的引用为响应式
    // state.userInfo = { ...userinfo } // 浅拷贝也是响应式
  },
  // 删除用户个人资料
  removeUserInfo(state) {
    state.userInfo = {}
  }
}
const actions = {
  async login(context, data) {
    const result = await login(data)
    // 如果失败下面代码不会执行, 因为 awiat只接受resolve的结果
    context.commit('setToken', result)
    // 如果登录成功则设置登录成功时的时间戳
    setTimeStamp()
  },
  // 获取员工基本资料
  async getUserInfo(context) {
    // result是返回数据data对象中的data
    // 我们在响应拦截器中已经把返回的数据去了data外衣并判断成功后返回内层data
    const result = await getUserInfo() // 获取用户基本资料
    const baseInfo = await getUserDetailById(result.userId)
    const baseResult = { ...result, ...baseInfo } // 合并用户基本资料和员工基本信息
    context.commit('setUserInfo', baseResult) // 将获取到的用户信息存入vuex中
    return baseResult // 为后面做权限做准备
  },
  // 退出登录功能
  logout(context) {
    context.commit('removeToken') // 删除token
    context.commit('removeUserInfo') // 删除用户个人资料
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}
